package main

import (
	"embed"
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

var (
	//go:embed config.json
	ConfigFs     embed.FS
	GlobalConfig Config
)

type Config struct {
	IsDebug bool         `json:"is_debug"`
	Redis   RedisConfig  `json:"redis"`
	Server  ServerConfig `json:"server"`
	Backup  BackupConfig `json:"backup"`
}

// RedisConfig Redis配置项
type RedisConfig struct {
	Host      string `json:"host"`       // 服务器地址
	Port      int    `json:"port"`       // 服务器端口
	Password  string `json:"password"`   // 访问密码 可为空
	DB        int    `json:"db"`         // 数据库编号 默认使用0号数据库
	KeyPrefix string `json:"key_prefix"` // 键前缀配置
}

type BackupConfig struct {
	Path string `json:"path"`
}

type ServerConfig struct {
	Port      int    `json:"port"`
	SecretKey string `json:"secret_key"` // 密钥 适用于所有需要对外签名计算的
}

func LoadConfig(configPath string) error {

	// 打印当前工作目录（调试用）
	pwd, _ := os.Getwd()
	fmt.Printf("当前工作目录: %s\n", pwd)

	// 列出所有嵌入的文件（调试用）
	entries, _ := ConfigFs.ReadDir(".")
	fmt.Println("Embedded files:")
	for _, entry := range entries {
		fmt.Printf("- %s\n", entry.Name())
	}

	// 从嵌入的文件系统读取配置
	data, err := ConfigFs.ReadFile(configPath)
	if err != nil {
		return fmt.Errorf("读取配置文件失败: %v", err)
	}

	// 解析JSON
	if err := json.Unmarshal(data, &GlobalConfig); err != nil {
		return fmt.Errorf("解析配置文件失败: %v", err)
	}

	redisHost := os.Getenv("REDIS_HOST")
	if redisHost != "" {
		GlobalConfig.Redis.Host = redisHost
	}

	redisPassword := os.Getenv("REDIS_PASSWORD")
	if redisPassword != "" {
		if redisPassword == "null" {
			redisPassword = ""
		}
		GlobalConfig.Redis.Password = redisPassword
	}

	IsDebug := strings.ToLower(os.Getenv("IS_DEBUG"))
	GlobalConfig.IsDebug = IsDebug == "true" || IsDebug == "1" || IsDebug == "yes" || IsDebug == "on"

	return nil
}

func (r RedisConfig) GetAddr() string {
	return fmt.Sprintf("%s:%d", r.Host, r.Port)
}

// GetKey 获取带前缀的key
func (r RedisConfig) GetKey(key string) string {
	if r.KeyPrefix != "" {
		return r.KeyPrefix + key
	}
	return key
}
